package org.springframework.session;

import java.time.Duration;
import java.util.Map;

import org.springframework.session.events.SessionDeletedEvent;
import org.springframework.session.events.SessionExpiredEvent;

public class MapSessionRepository implements SessionRepository<MapSession> {

	private Integer defaultMaxInactiveInterval;

	private final Map<String, Session> sessions;

	public MapSessionRepository(Map<String, Session> sessions) {
		if (sessions == null) {
			throw new IllegalArgumentException("sessions cannot be null");
		}
		this.sessions = sessions;
	}

	public void setDefaultMaxInactiveInterval(int defaultMaxInactiveInterval) {
		this.defaultMaxInactiveInterval = defaultMaxInactiveInterval;
	}

	/**
	 * 这里面先判断了session中的两个ID，一个originalId，一个当前id。originalId是第一次生成session对象时创建的，后面都不会在变化。
	 * 通过源码来看，对于originalId，只提供了get方法。对于id呢，其实是可以通过changeSessionId来改变的。
	 * 这里的这个操作实际上是一种优化行为，及时的清除掉老的session数据来释放内存空间。
	 */
	@Override
	public void save(MapSession session) {
		if (!session.getId().equals(session.getOriginalId())) {
			this.sessions.remove(session.getOriginalId());
		}
		this.sessions.put(session.getId(), new MapSession(session));
	}

	@Override
	public MapSession findById(String id) {
		Session saved = this.sessions.get(id);
		if (saved == null) {
			return null;
		}
		if (saved.isExpired()) {
			deleteById(saved.getId());
			return null;
		}
		// TODO:
		return new MapSession(saved);
	}

	@Override
	public void deleteById(String id) {
		this.sessions.remove(id);
	}

	@Override
	public MapSession createSession() {
		MapSession result = new MapSession();
		if (this.defaultMaxInactiveInterval != null) {
			result.setMaxInactiveInterval(Duration.ofSeconds(this.defaultMaxInactiveInterval));
		}
		return result;
	}
}
